package https

import (
	"net/url"
	"time"
)

// 请求开始前的钩子操作
func (c *CURL) hookBefore() *CURL {
	c.
		header_default("accept", "application/json, text/plain, */*").
		header_default("Content-Type", "application/json").
		header_default("accept-language", "zh-CN,zh;q=0.9,en;q=0.8").
		header_default("user-agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1")
	// 缓存判定，如果存在缓存的话就直接追加响应值，且配置error错误对象
	ck, err := url.QueryUnescape(_default.cacheInterface.Get(c.getKey()))
	if err == nil && ck != "" {
		c.Body = ck
		c.cache_hit = true
	}
	return c
}

// 设置header默认值，且配置该值忽略日志记录
//
//	k	header下标
//	v	下标值
func (c *CURL) header_default(k, v string) *CURL {
	// 追加Header请求头
	if c.Header_quest == nil {
		c.Header_quest = map[string]string{}
	}
	if _, ok := c.Header_quest[k]; !ok {
		c.Header_quest[k] = v
		// 判断忽略参数里有无此head头
		for i := 0; i < len(c.option.ignore_header); i++ {
			if c.option.ignore_header[i] == k {
				return c
			}
		}
		c.option.ignore_header = append(c.option.ignore_header, k)
	}
	return c
}

// 请求结束的钩子操作
func (c *CURL) hookEnd() *CURL {
	c.EndTime = time.Now()
	// 记录缓存
	if c.option.cache_time > 0 {
		// 将Body进行 url.QueryEscape 编码，避免中间出现"导致redis存储失败
		_default.cacheInterface.Set(c.getKey(), url.QueryEscape(c.Body), c.option.cache_time)
	}
	// 移除忽略的请求头信息
	for i := 0; i < len(c.option.ignore_header); i++ {
		delete(c.Header_quest, c.option.ignore_header[i])
	}
	// 记录日志
	if len(_default.LogFunc) > 0 {
		for i := 0; i < len(_default.LogFunc); i++ {
			_default.LogFunc[i](c)
		}
	}
	return c
}
